/*
 * © 2024 huayunliufeng保留所有权利, 依据MIT许可证发布。
 * 请勿更改或删除版权声明或此文件头。
 * 此代码是免费软件, 您可以重新分发和/或修改它。
 * 开源是希望它有用, 但不对代码做任何保证。
 * 如有疑问请联系: huayunliufeng@163.com
 */

package io.github.huayunliufeng.common.utils;

import java.util.Random;

/**
 * 常用的数据。（一般都是获取随机数据）
 *
 * @author zhongq
 * @datetime 2024/4/2 16:10
 */
public class HylfSimpleDataUtil {
    public static final Random random = new Random(System.currentTimeMillis());
    public static final char[] UPPERCASE_LETTER_CHAR_ARRAY = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'
            , 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    public static final char[] LOWERCASE_LETTER_CHAR_ARRAY = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n'
            , 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    public static final char[] NUMBER_CHAR_ARRAY = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    /**
     * 获取范围内的随机数, 闭区间
     *
     * @param low  左边界
     * @param high 右边界
     * @return 范围内的随机数
     */
    public static int getRandomNumber(int low, int high) {
        return random.nextInt(high - low + 1) + low;
    }

    /**
     * 获取一个随机的中文字符: 0x4E00-0x9FA5之间
     *
     * @return 一个随机的中文字符
     */
    public static char getRandomChineseChar() {
        return (char) getRandomNumber(0x4E00, 0x9FA5);
    }

    /**
     * 获取指定长度的随机中文字符串
     *
     * @param length 字符串长度
     * @return 指定长度的随机中文字符串
     */
    public static String getRandomChineseStr(int length) {
        if (length <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(getRandomChineseChar());
        }
        return sb.toString();
    }

    /**
     * 获取指定长度的随机纯数字字符串
     *
     * @param length 字符串长度
     * @return 指定长度的随机纯数字字符串
     */
    public static String getRandomNumberStr(int length) {
        if (length <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(NUMBER_CHAR_ARRAY[getRandomNumber(0, NUMBER_CHAR_ARRAY.length - 1)]);
        }
        return sb.toString();
    }

    /**
     * 获取指定长度的随机纯大写字母字符串
     *
     * @param length 字符串长度
     * @return 指定长度的随机纯大写字母字符串
     */
    public static String getRandomUpperCaseStr(int length) {
        if (length <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(UPPERCASE_LETTER_CHAR_ARRAY[getRandomNumber(0, UPPERCASE_LETTER_CHAR_ARRAY.length - 1)]);
        }
        return sb.toString();
    }

    /**
     * 获取指定长度的随机纯小写字母字符串
     *
     * @param length 字符串长度
     * @return 指定长度的随机纯小写字母字符串
     */
    public static String getRandomLowerCaseStr(int length) {
        if (length <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(LOWERCASE_LETTER_CHAR_ARRAY[getRandomNumber(0, LOWERCASE_LETTER_CHAR_ARRAY.length - 1)]);
        }
        return sb.toString();
    }

    /**
     * 从给定的数据源中获取指定长度的随机字符串, 可指定是否包含中文
     *
     * @param minLength     字符串最小长度
     * @param maxLength     字符串最大长度
     * @param hasChinese 是否包含中文
     * @param charSource 数据源
     * @return 指定长度的随机字符串
     */
    public static String getRandomStr(int minLength, int maxLength, boolean hasChinese, char[]... charSource) {
        int length = getRandomNumber(minLength, maxLength);
        if (length <= 0 || HylfCollectionUtil.isEmpty(charSource)) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        int n = charSource.length;
        for (int i = 0; i < length; i++) {
            int index = getRandomNumber(0, n - 1);
            char[] tmp = charSource[index];
            int len = tmp.length;
            if (hasChinese && random.nextBoolean()) {
                sb.append(getRandomChineseChar());
            } else {
                sb.append(tmp[getRandomNumber(0, len - 1)]);
            }
        }
        return sb.toString();
    }

    /**
     * 从给定的数据源中获取指定长度的随机字符串, 不包含中文
     *
     * @param minLength     字符串最小长度
     * @param maxLength     字符串最大长度
     * @param charSource 数据源
     * @return 指定长度的随机字符串
     */
    public static String getRandomStr(int minLength, int maxLength, char[]... charSource) {
        return getRandomStr(minLength, maxLength, false, charSource);
    }

    /**
     * 生成包含大小写字母、数字的随机字符串
     *
     * @param minLength     字符串最小长度
     * @param maxLength     字符串最大长度
     * @param hasChinese 是否包含中文
     * @return 一个随机字符串
     */
    public static String getRandomStr(int minLength, int maxLength, boolean hasChinese) {
        char[] chars = HylfCollectionUtil.mergeCharArray(NUMBER_CHAR_ARRAY, UPPERCASE_LETTER_CHAR_ARRAY, LOWERCASE_LETTER_CHAR_ARRAY);
        return getRandomStr(minLength, maxLength, hasChinese, chars);
    }

}
